package es.udc.acs.banco.client;

import java.net.SocketTimeoutException;

import es.udc.acs.banco.server.BancoServer;
import es.udc.acs.banco.sesion.ControlSesion;
import es.udc.acs.banco.sesion.Sesion;
import es.udc.acs.banco.util.GestorProperties;
import es.udc.acs.parser.ParserMensaje;
import es.udc.acs.udp.ClienteUDP;
import es.udc.acs.udp.QuestionServer;
import es.udc.acs.udp.ServerUDP;
import es.udc.acs.utils.CodigosFAP;

public class BancoClient {

	private static String server;
	private static int portConsorcio;
	private static int portBanco;
    private static ServerUDP servidorBanco;
    

	static {		

		String pconsorcio =	GestorProperties.
				devolverPropiedad(GestorProperties.PUERTOCONSORCIO);	
		
		String puertoBanco = GestorProperties.
				devolverPropiedad(GestorProperties.PUERTOBANCO);
		
		server = ParserMensaje.obtenerServer(pconsorcio);
		portConsorcio = Integer.parseInt(
				ParserMensaje.obtenerPuerto(pconsorcio));
	    portBanco = Integer.parseInt(ParserMensaje.obtenerPuerto(puertoBanco));
	}
	
	private BancoClient(){}

	public static void arrancarServidor(int puerto)  {
		try{
			QuestionServer q = new BancoServer();
			servidorBanco = new ServerUDP(puerto, q);
			servidorBanco.start();
			System.out.println("Servidor Banco arrancado");
		}catch (Exception e){}
	}
	
	public static void enviarAperturaSesion() {
			
		String mensaje = "";
		
		try {
			
			if (!ControlSesion.obtenerSesion().puedoAperturaSesion()) {
				System.out.println(
						"Estado incorrecto, no es posible abrir sesion");
			} else {
				
				mensaje = ControlClient.mensajeSolicitarAbrirSesion();
			    
				GestorProperties.tratarMensaje(
						"BancoClient:mensaje enviado: ",mensaje);
				String respuesta = ClienteUDP.sendMessage(
						server, portConsorcio, mensaje,90);				    
				GestorProperties.tratarMensaje(
						"BancoClient:mensaje recibido: ",respuesta);
				
				String cuerpo = ParserMensaje.obtenerCuerpo(respuesta);
				
				if (ParserMensaje.obtenerCodRespuesta(cuerpo).
						equals(CodigosFAP.CODRE_CORRECTA)) { 					
					
					ControlSesion.nuevaSesion();
					
					if (!ControlSesion.obtenerSesion().aperturaSesion()) {
						System.out.println("Error: estado no valido.");
						return;
					}
					
					arrancarServidor(portBanco);
				}				
			}
			
		} catch (SocketTimeoutException e) {
			System.out.println("Consorcio no disponible");
			GestorProperties.tratarMensaje(
					"BancoClient:consorcio no disponible:", mensaje);
		} catch (Exception e) {
			e.printStackTrace();
		} 	
	}
	
	
	public static void enviarDetenerTrafico() {
		
		String mensaje = "";
		
		try {
			
			if (!ControlSesion.obtenerSesion().puedoDetenerTrafico()) {
				System.out.println(
						"Estado incorrecto, no es posible detener trafico");
			} else {		
		
				mensaje = ControlClient.mensajeSolicitarDetenerTrafico();			    
			    
				GestorProperties.tratarMensaje(
						"BancoClient:mensaje enviado: ",mensaje);				
				String respuesta = ClienteUDP.sendMessage(
						server, portConsorcio, mensaje,90);						
			    GestorProperties.tratarMensaje(
			    		"BancoClient:mensaje recibido: ",respuesta);
				
				String cuerpo = ParserMensaje.obtenerCuerpo(respuesta);
				
				if (ParserMensaje.obtenerCodRespuesta(cuerpo).
						equals(CodigosFAP.CODRE_CORRECTA)) { 
						
					if (!ControlSesion.obtenerSesion().detenerTrafico()) {
						System.out.println("Error: estado no valido.");
						return;
					}
				}	
			}
		} catch (SocketTimeoutException e) {
			System.out.println("Consorcio no disponible");
			GestorProperties.tratarMensaje(
					"BancoClient:consorcio no disponible:", mensaje);
		} catch (Exception e) {
			e.printStackTrace();
		} 	
	}
	
	
	public static void enviarReanudarTrafico() {
		
		String mensaje = "";
		
		try {
			
			if (!ControlSesion.obtenerSesion().puedoReanudarTrafico()) {
				System.out.println(
						"Estado incorrecto, no es posible reanudar trafico");
			} else {
		
				mensaje = ControlClient.mensajeSolicitarReanudarTrafico();			    
			    
				GestorProperties.tratarMensaje(
						"BancoClient:mensaje enviado: ",mensaje);				
				String respuesta = ClienteUDP.sendMessage(
						server, portConsorcio, mensaje,90);					
				GestorProperties.tratarMensaje(
						"BancoClient:mensaje recibido: ",respuesta);
				
				String cuerpo = ParserMensaje.obtenerCuerpo(respuesta);

				if (ParserMensaje.obtenerCodRespuesta(cuerpo).
						equals(CodigosFAP.CODRE_CORRECTA)) { 
						
					if (!ControlSesion.obtenerSesion().reanudarTrafico()) {
						System.out.println("Error: estado no valido.");
						return;
					}
				}
			}
		} catch (SocketTimeoutException e) {
			System.out.println("Consorcio no disponible");
			GestorProperties.tratarMensaje(
					"BancoClient:consorcio no disponible:", mensaje);	
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
	
	
	public static void enviarCierreSesion() {
		
		String mensaje = "";
		
		try {
			
			if (!ControlSesion.obtenerSesion().puedoCierreSesion()) {
				System.out.println(
						"Estado incorrecto, no es posible cerrar sesion");
			} else {
				mensaje = ControlClient.mensajeSolicitarCierreSesion();
			    
				GestorProperties.tratarMensaje(
						"BancoClient:mensaje enviado: ",mensaje);
				String respuesta = ClienteUDP.sendMessage(
						server, portConsorcio, mensaje,90);				
				GestorProperties.tratarMensaje(
						"BancoClient:mensaje recibido: ",respuesta);
				
				String cuerpo = ParserMensaje.obtenerCuerpo(respuesta);
		
				if (!ParserMensaje.obtenerCodRespuesta(cuerpo).equals(
						CodigosFAP.CODRE_CORRECTA)) { 
					return;
				}
					
				Sesion sesion = ControlSesion.obtenerSesion();

				if (!(Integer.parseInt(ParserMensaje.
						obtenerReintegrosCS(cuerpo,4)) 
						== (sesion.obtenerReintegros())) 
						|| !(Integer.parseInt(ParserMensaje.
						obtenerAbonosCS(cuerpo,4)) 
						== sesion.obtenerAbonos()) 
						|| !(Integer.parseInt(ParserMensaje.
						obtenerTraspasosCS(cuerpo,4)) 
						== sesion.obtenerTraspasos())) {
						
					System.out.println("AVISO:Diferencias de conciliacion");				
				}
				
				if (!ControlSesion.obtenerSesion().cierreSesion()) {
					System.out.println("Error: estado no valido.");
					return;
				}

				}
		} catch (SocketTimeoutException e) {
			System.out.println("Consorcio no disponible");
			GestorProperties.tratarMensaje(
					"BancoClient:consorcio no disponible:", mensaje);
		} catch (Exception e) {
			e.printStackTrace();
		}			
	}
}
